Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

318
Views
mecanografiado: cómo escribir correctamente los parámetros de clave y valor en Object.entries().forEach([key,value]) =>

Obtuve un objeto con parámetros de clave/valor específicos y quiero iterar sobre él con el método de entradas () de Objeto seguido de un método forEach () de Array. Sin embargo, no entiendo cómo tengo que escribir esta configuración para evitar un error mecanografiado:

 type objType = { prop1: number | undefined; prop2: number | undefined; prop3: number | undefined; }; const obj: objType = { prop1: 2, prop2: 0, prop3: undefined, }; //1st attempt Object.entries(obj).forEach(([key, value]) => { if (value === undefined || value < 5) obj[key] = 5; }); //2nd attempt Object.entries(obj).forEach( ([key, value]: [keyof objType, number | undefined]) => { if (value === undefined || value < 5) obj[key] = 5; } );

En el primer intento, dejé que TypeScript infiriera el tipo de key (→ string ) y el value (→ number|undefined ). Pero en este caso recibí un error al hacer obj[key] :

El elemento tiene implícitamente un tipo 'cualquiera' porque la expresión del tipo 'cadena' no se puede usar para indexar el tipo 'objType'. No se encontró ninguna firma de índice con un parámetro de tipo 'cadena' en el tipo 'objType'.

En el segundo intento, forcé que el tipo de key se correspondiera con la clave de obj usando el operador keyof , pero esta definición de tipo no está permitida y recibí el siguiente mensaje:

El argumento de tipo '([clave, valor]: [clave de objType, número | indefinido]) => void' no se puede asignar al parámetro de tipo '(valor: [cadena, número | indefinido], índice: número, matriz: [ cadena, número | indefinido][]) => vacío'. Los tipos de parámetros '__0' y 'valor' son incompatibles. Escriba '[cadena, número | undefined]' no se puede asignar al tipo '[keyof objType, number | indefinido]'. El tipo en la posición 0 en el origen no es compatible con el tipo en la posición 0 en el destino. El tipo 'cadena' no se puede asignar al tipo 'keyof objType'.

Entiendo el fracaso del primer intento pero no del segundo. ¿Por qué TS cree que quiero asignar una cadena a la enumeración de cadenas, supongo que debo hacer lo contrario...?

¿Cómo es la forma correcta de escribir esta configuración?

about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

Por qué

En primer lugar, debemos entender por qué sucede esto: veamos el ejemplo más simple:

 const obj = {a: 1}; Object.keys(obj).forEach((key:keyof typeof obj)=> ''); // fails because Type 'string' is not assignable to type '"a"'

Esto sucede porque TS no puede garantizar que no haya otras claves en el objeto. Por lo tanto, no puede garantizar que la clave sea SOLO 'a'.

En su caso, esto significa que TS no puede garantizar que el valor de obj[key] sea un número. Puede ser cualquier cosa, por lo que TS arroja un error.

Ejemplo

Opción 1

Una forma de manejar esto es obligar a TS a usar sus tipos:

 //1st attempt Object.entries(obj).forEach(([key, value]) => { if (value === undefined || value < 5) obj[key as keyof typeof obj] = 5; }); //2nd attempt Object.entries(obj).forEach( ([key, value]) => { if (value === undefined || value < 5) obj[key as keyof typeof obj] = 5; } );

Esto está bien en caso de que esté absolutamente seguro de que no habrá claves adicionales.

Opcion 2

Otra forma es rediseñar sus tipos en algo un poco más genérico:

 type objType = { prop1: number | undefined; prop2: number | undefined; prop3: number | undefined; } const obj: Record<string, number | undefined> = { prop1: 2, prop2: 0, prop3: undefined, }; //1st attempt Object.entries(obj).forEach(([key, value]) => { if (value === undefined || value < 5) obj[key] = 5; }); //2nd attempt Object.entries(obj).forEach( ([key, value]) => { if (value === undefined || value < 5) obj[key] = 5; } );

En el código anterior, se indica claramente que permitimos cualquier clave de cadena.

Por favor verifique algunos detalles adicionales

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!